package web.stu.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import web.stu.common.ErrorCode;
import web.stu.config.Result;
import web.stu.exception.BusinessException;
import web.stu.model.dto.scoreAudit.AddScoreAuditDTO;
import web.stu.model.dto.scoreAudit.QueryScoreAuditDTO;
import web.stu.model.entity.User;
import web.stu.model.enums.UserRoleEnum;
import web.stu.model.vo.ScoreAuditVO;
import web.stu.service.ScoreAuditService;
import web.stu.service.UserService;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * 成绩审核管理控制器
 * 
 * <p>提供成绩审核流程的管理功能，包括成绩审核记录的查询、添加和审核操作。</p>
 * 
 * <p>不同操作需要不同权限：</p>
 * <ul>
 *   <li>查询：教师或管理员</li>
 *   <li>添加：仅管理员</li>
 *   <li>审核：教师或管理员</li>
 * </ul>
 * 
 * @author 系统开发者
 * @version 1.0
 * @since 2025-05-29
 */
@Slf4j
@RestController
@RequestMapping("/scoreAudit")
@Api(value = "成绩审核的管理模块", tags = "成绩审核模块")
public class ScoreAuditController {

    @Resource
    private ScoreAuditService scoreAuditService;

    @Resource
    private UserService userService;


    /**
     * 分页模糊查询成绩审核记录
     *
     * @param queryScoreAuditDTO 查询条件DTO，包含分页参数和筛选条件
     * @param request HTTP请求对象
     * @return 分页查询结果，包含成绩审核记录列表
     * @throws BusinessException 如果参数为空或用户无权限
     * @apiNote 此接口需要教师或管理员权限
     */
    @PostMapping("/page")
    public Result<Page<ScoreAuditVO>> pageScoreAudit(@RequestBody QueryScoreAuditDTO queryScoreAuditDTO, HttpServletRequest request) {
        // 非空判断
        if (queryScoreAuditDTO == null) {
            throw new BusinessException(ErrorCode.PRIMARY_ERROR);
        }
        // 权限校验
        User loginUser = userService.getLoginUser(request);
        if (!userService.isCompareRole(loginUser, UserRoleEnum.TEACHER.getKey())
                && !userService.isCompareRole(loginUser, UserRoleEnum.ADMIN.getKey())) {
            throw new BusinessException(ErrorCode.NO_AUTH_ERROR, "仅教师或管理员可用");
        }

        Page<ScoreAuditVO> scoreAuditVOPage = scoreAuditService.pageAuditRecords(queryScoreAuditDTO, request);
        return Result.success(scoreAuditVOPage);
    }


    /**
     * 添加成绩审核记录
     *
     * @param addScoreAuditDTO 包含成绩ID和审核状态的DTO对象
     * @param request HTTP请求对象
     * @return 操作结果
     * @throws BusinessException 如果参数为空、成绩不存在或用户无权限
     * @apiNote 此接口需要管理员权限
     */
    @PostMapping("/add")
    public Result<Void> addAuditScore(@RequestBody AddScoreAuditDTO addScoreAuditDTO, HttpServletRequest request) {
        // 非空判断
        if (addScoreAuditDTO == null) {
            throw new BusinessException(ErrorCode.PRIMARY_ERROR);
        }
        // 权限校验
        User loginUser = userService.getLoginUser(request);
        if (!userService.isCompareRole(loginUser, UserRoleEnum.ADMIN.getKey())) {
            throw new BusinessException(ErrorCode.NO_AUTH_ERROR, "仅管理员可用");
        }
        scoreAuditService.addAuditScore(addScoreAuditDTO, request);
        return Result.success();

    }

    /**
     * 更新成绩审核状态
     *
     * @param addScoreAuditDTO 包含成绩ID和审核状态的DTO对象
     * @param request HTTP请求对象
     * @return 操作结果
     * @throws BusinessException 如果参数为空、成绩不存在或用户无权限
     * @apiNote 此接口需要教师或管理员权限，审核通过后会更新对应成绩
     */
    @PutMapping("/update")
    public Result<Void> updateAudit(@Validated @RequestBody AddScoreAuditDTO addScoreAuditDTO, HttpServletRequest request) {
        // 非空判断
        if (addScoreAuditDTO == null) {
            throw new BusinessException(ErrorCode.PRIMARY_ERROR);
        }
        // 权限校验
        User loginUser = userService.getLoginUser(request);
        if (!userService.isCompareRole(loginUser, UserRoleEnum.TEACHER.getKey())
                && !userService.isCompareRole(loginUser, UserRoleEnum.ADMIN.getKey())) {
            throw new BusinessException(ErrorCode.NO_AUTH_ERROR, "仅教师或管理员可用");
        }
        scoreAuditService.updateAuditAndScore(addScoreAuditDTO, request);
        return Result.success();

    }


}